(function () {
  // 抽象类不能用来创建对象
  // 抽象类中可以定义抽象方法
  abstract class Animal {
    name: string;

    constructor(name: string) {
      this.name = name;
    }

    // 抽象方法使用 abstract 开头，没有方法体
    // 抽象方法只能定义在抽象类中，子类必须对抽象方法进行重写override
    abstract makeSound(): void; // 定义抽象方法
  }

  class Dog extends Animal {
    // 实现抽象方法
    makeSound() {
      console.log("Wang! Wang!");
    }
  }

  class Cat extends Animal {
    makeSound() {
      console.log("Meow! Meow!");
    }
  }

  let d = new Dog("Spike");
  d.makeSound();

  let c = new Cat("Tom");
  c.makeSound();
})();
